package com.lighting.shortlink.project.toolkit;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import jakarta.servlet.http.HttpServletRequest;

import java.net.URI;
import java.util.Date;
import java.util.Optional;

import static com.lighting.shortlink.project.common.constant.ShortLinkConstant.DEFAULT_CACHE_VALID_TIME;

/**
 * 短链接工具类
 * @author : lighting
 */
public class LinkUtil {
    /**
     * 获取短链接缓存有效期时间
     *
     * @param validDate 有效期时间
     * @return 有限期时间戳
     */
    public static long getLinkCacheValidTime(Date validDate) {
        /// 如果有效期时间不为空，则计算当前时间与有效期时间之间的时间间隔（毫秒）
        return Optional.ofNullable(validDate)
                .map(each -> DateUtil.between(new Date(), each, DateUnit.MS))
                // 如果有效期时间为空，则返回默认的缓存有效期时间
                .orElse(DEFAULT_CACHE_VALID_TIME);
    }

    /**
     * 获取实际 IP 地址
     *
     * @param request HTTP 请求对象
     * @return 实际 IP 地址
     */
    public static String getActualIp(HttpServletRequest request) {
        // 从请求头部获取 X-Forwarded-For 字段的值作为 IP 地址
        String ipAddress = request.getHeader("X-Forwarded-For");
        // 如果 X-Forwarded-For 字段值为空或者为 unknown，则尝试从 Proxy-Client-IP 字段获取 IP 地址
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("Proxy-Client-IP");
        }
        // 如果 Proxy-Client-IP 字段值为空或者为 unknown，则尝试从 WL-Proxy-Client-IP 字段获取 IP 地址
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("WL-Proxy-Client-IP");
        }
        // 如果 WL-Proxy-Client-IP 字段值为空或者为 unknown，则尝试从 HTTP_CLIENT_IP 字段获取 IP 地址
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("HTTP_CLIENT_IP");
        }
        // 如果 HTTP_CLIENT_IP 字段值为空或者为 unknown，则尝试从 HTTP_X_FORWARDED_FOR 字段获取 IP 地址
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        // 如果 HTTP_X_FORWARDED_FOR 字段值为空或者为 unknown，则直接从请求对象获取远程客户端的 IP 地址
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddr();
        }
        // 返回获取到的 IP 地址
        return ipAddress;
    }


    /**
     * 获取用户访问操作系统
     *
     * @param request 请求对象
     * @return 用户访问的操作系统
     */
    public static String getOs(HttpServletRequest request) {
        // 获取 User-Agent 头部信息
        String userAgent = request.getHeader("User-Agent");
        // 判断 User-Agent 中是否包含关键字来确定操作系统
        if (userAgent.toLowerCase().contains("windows")) {
            return "Windows";
        } else if (userAgent.toLowerCase().contains("mac")) {
            return "Mac OS";
        } else if (userAgent.toLowerCase().contains("linux")) {
            return "Linux";
        } else if (userAgent.toLowerCase().contains("android")) {
            return "Android";
        } else if (userAgent.toLowerCase().contains("iphone") || userAgent.toLowerCase().contains("ipad")) {
            return "iOS";
        } else {
            return "未知";
        }
    }

    /**
     * 获取用户访问浏览器
     *
     * @param request 请求对象
     * @return 用户访问的浏览器
     */
    public static String getBrowser(HttpServletRequest request) {
        // 获取 User-Agent 头部信息
        String userAgent = request.getHeader("User-Agent");
        // 判断 User-Agent 中是否包含关键字来确定浏览器
        if (userAgent.toLowerCase().contains("edg")) {
            return "Microsoft Edge";
        } else if (userAgent.toLowerCase().contains("chrome")) {
            return "Google Chrome";
        } else if (userAgent.toLowerCase().contains("firefox")) {
            return "Mozilla Firefox";
        } else if (userAgent.toLowerCase().contains("safari")) {
            return "Apple Safari";
        } else if (userAgent.toLowerCase().contains("opera")) {
            return "Opera";
        } else if (userAgent.toLowerCase().contains("msie") || userAgent.toLowerCase().contains("trident")) {
            return "Internet Explorer";
        } else {
            return "未知";
        }
    }

    /**
     * 获取用户访问设备
     *
     * @param request 请求对象
     * @return 用户访问的设备类型
     */
    public static String getDevice(HttpServletRequest request) {
        // 获取 User-Agent 头部信息
        String userAgent = request.getHeader("User-Agent");
        // 判断 User-Agent 中是否包含关键字来确定设备类型
        if (userAgent.toLowerCase().contains("mobile")) {
            return "移动设备";
        }
        return "PC";
    }

    /**
     * 获取用户访问网络类型
     *
     * @param request 请求对象
     * @return 用户访问的网络类型
     */
    public static String getNetwork(HttpServletRequest request) {
        // 获取用户的实际 IP 地址
        String actualIp = getActualIp(request);
        // 这里简单判断IP地址范围，您可能需要更复杂的逻辑
        // 例如，通过调用IP地址库或调用第三方服务来判断网络类型
        return actualIp.startsWith("192.168.") || actualIp.startsWith("10.") ? "WIFI" : "移动网络";
    }

    /**
     * 获取原始链接中的域名
     * 如果原始链接包含 www 开头的话需要去掉
     *
     * @param url 原始链接
     * @return 域名
     */

    public static String extractDomain(String url) {
        String domain = null;
        try {
            // 解析链接得到域名
            URI uri = new URI(url);
            String host = uri.getHost();
            if (StrUtil.isNotBlank(host)) {
                domain = host;
                if (domain.startsWith("www.")) {
                    domain = host.substring(4);
                }
            }
        } catch (Exception ignored) {
        }
        return domain;
    }

}
